/**
 * 浏览器工作流 - 后台服务脚本
 * 处理扩展的后台逻辑、消息传递和数据同步
 */

// 扩展安装时的初始化
chrome.runtime.onInstalled.addListener(function(details) {
  console.log('浏览器工作流扩展已安装');
  
  // 设置默认配置
  chrome.storage.sync.set({
    enableExtension: true,
    playbackSpeed: 500, // 默认回放频率500毫秒
    useOriginalTimings: true, // 默认使用原始时间间隔
    showLogs: false, // 默认关闭操作日志面板
    highlightElements: true,
    highlightColor: '#ff6b6b', // 默认高亮颜色为红色
    showFloatingButton: false,
    debugMode: false,
    recordScroll: true,
    recordKeyboard: true,
    smartSelector: true,
    maxActions: 1000
  });

  // 初始化本地存储
  chrome.storage.local.set({
    isRecording: false,
    recordedActions: [],
    playbackMode: false
  });

  // 如果是首次安装，显示欢迎页面
  if (details.reason === 'install') {
    chrome.tabs.create({
      url: chrome.runtime.getURL('options/options.html')
    });
  }
});

/**
 * 处理来自content script和popup的消息
 */
chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
  console.log('后台脚本收到消息:', request);
  
  switch (request.type) {
    case 'GET_STATUS':
      // 返回当前状态
      chrome.storage.local.get(['isRecording', 'playbackMode'], function(result) {
        let status = '就绪';
        if (result.isRecording) {
          status = '录制中';
        } else if (result.playbackMode) {
          status = '回放中';
        }
        sendResponse({ status: status });
      });
      return true;
      
    case 'UPDATE_STATUS':
      // 更新状态
      chrome.storage.sync.set({ browserWorkStatus: request.status });
      sendResponse({ success: true });
      break;
      
    case 'RECORDING_STARTED':
      // 录制开始
      chrome.storage.local.set({ isRecording: true });
      updateBadge('REC', '#dc3545');
      sendResponse({ success: true });
      break;
      
    case 'RECORDING_STOPPED':
      // 录制停止
      chrome.storage.local.set({ isRecording: false });
      updateBadge('', '#28a745');
      sendResponse({ success: true });
      break;
      
    case 'PLAYBACK_STARTED':
      // 回放开始
      chrome.storage.local.set({ playbackMode: true });
      updateBadge('PLAY', '#667eea');
      sendResponse({ success: true });
      break;
      
    case 'PLAYBACK_COMPLETE':
    case 'PLAYBACK_ERROR':
      // 回放完成或错误
      chrome.storage.local.set({ playbackMode: false });
      updateBadge('', '#28a745');
      
      // 通知所有popup窗口
      notifyPopups(request);
      sendResponse({ success: true });
      break;
      
    case 'ACTION_RECORDED':
      // 操作已录制
      handleActionRecorded(request.action);
      sendResponse({ success: true });
      break;
      
    case 'PAGE_LOADED':
      // 页面加载完成
      handlePageLoaded(sender.tab.id, request.data);
      sendResponse({ success: true });
      break;
      
    case 'START_RECORDING_FROM_FLOAT':
      // 从浮动按钮开始录制
      handleFloatingButtonAction(sender.tab.id, 'start');
      break;
      
    case 'STOP_RECORDING_FROM_FLOAT':
      // 从浮动按钮停止录制
      handleFloatingButtonAction(sender.tab.id, 'stop');
      break;
      
    case 'SETTINGS_UPDATED':
      // 设置已更新，通知所有content script
      chrome.tabs.query({}, function(tabs) {
        tabs.forEach(tab => {
          chrome.tabs.sendMessage(tab.id, {
            type: 'UPDATE_SETTINGS',
            data: request.data
          }).catch(() => {
            // 忽略错误
          });
        });
      });
      sendResponse({ success: true });
      break;
      
    default:
      console.warn('未知的消息类型:', request.type);
      sendResponse({ error: '未知的消息类型' });
  }
});

/**
 * 更新扩展图标徽章
 * @param {string} text - 徽章文本
 * @param {string} color - 徽章颜色
 */
function updateBadge(text, color) {
  chrome.action.setBadgeText({ text: text });
  chrome.action.setBadgeBackgroundColor({ color: color });
}

/**
 * 处理录制的操作
 * @param {Object} action - 操作数据
 */
function handleActionRecorded(action) {
  // 获取当前录制数据并添加新操作
  chrome.storage.local.get(['recordedActions', 'maxActions'], function(result) {
    let actions = result.recordedActions || [];
    const maxActions = result.maxActions || 1000;
    
    // 添加新操作
    actions.push(action);
    
    // 检查是否超过最大限制
    if (actions.length > maxActions) {
      actions = actions.slice(-maxActions); // 保留最新的操作
    }
    
    // 保存更新后的数据
    chrome.storage.local.set({ recordedActions: actions });
  });
}

/**
 * 处理页面加载完成
 * @param {number} tabId - 标签页ID
 * @param {Object} data - 页面数据
 */
function handlePageLoaded(tabId, data) {
  console.log('页面加载完成:', data.url);
  
  // 检查是否需要自动开始录制
  chrome.storage.local.get(['autoStartRecording'], function(result) {
    if (result.autoStartRecording) {
      chrome.tabs.sendMessage(tabId, { type: 'START_RECORDING' });
    }
  });
  
  // 更新页面访问统计
  updatePageStats(data.url);
}

/**
 * 处理浮动按钮操作
 * @param {number} tabId - 标签页ID
 * @param {string} action - 操作类型
 */
function handleFloatingButtonAction(tabId, action) {
  if (action === 'start') {
    chrome.tabs.sendMessage(tabId, { type: 'START_RECORDING' });
  } else if (action === 'stop') {
    chrome.tabs.sendMessage(tabId, { type: 'STOP_RECORDING' });
  }
}

/**
 * 通知所有popup窗口
 * @param {Object} message - 消息内容
 */
function notifyPopups(message) {
  // Chrome扩展中，popup窗口会自动接收runtime消息
  // 这里主要是为了确保消息传递的一致性
  try {
    chrome.runtime.sendMessage(message);
  } catch (error) {
    // 如果没有popup窗口打开，会抛出错误，这是正常的
    console.log('没有打开的popup窗口');
  }
}

/**
 * 更新页面访问统计
 * @param {string} url - 页面URL
 */
function updatePageStats(url) {
  chrome.storage.local.get(['pageStats'], function(result) {
    const stats = result.pageStats || {};
    const domain = new URL(url).hostname;
    
    if (!stats[domain]) {
      stats[domain] = { count: 0, lastVisit: Date.now() };
    }
    
    stats[domain].count++;
    stats[domain].lastVisit = Date.now();
    
    chrome.storage.local.set({ pageStats: stats });
  });
}

/**
 * 监听标签页更新事件
 */
chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) {
  if (changeInfo.status === 'complete' && tab.url) {
    console.log('标签页加载完成:', tab.url);
    
    // 检查是否有正在进行的录制需要继续
    chrome.storage.local.get(['isRecording'], function(result) {
      if (result.isRecording) {
        // 确保新页面的content script也开始录制
        setTimeout(() => {
          chrome.tabs.sendMessage(tabId, { 
            type: 'CONTINUE_RECORDING' 
          }).catch(() => {
            // 忽略错误，某些页面可能不支持content script
          });
        }, 1000);
      }
    });
  }
});

/**
 * 监听标签页关闭事件
 */
chrome.tabs.onRemoved.addListener(function(tabId, removeInfo) {
  // 如果录制中的标签页被关闭，停止录制
  chrome.storage.local.get(['isRecording'], function(result) {
    if (result.isRecording) {
      console.log('录制中的标签页被关闭，停止录制');
      chrome.storage.local.set({ isRecording: false });
      updateBadge('', '#28a745');
    }
  });
});

/**
 * 处理扩展图标点击事件
 */
chrome.action.onClicked.addListener(function(tab) {
  // 如果没有popup，这里会被触发
  // 当前配置中有popup，所以这个事件不会被触发
  console.log('扩展图标被点击');
});

/**
 * 监听存储变化
 */
chrome.storage.onChanged.addListener(function(changes, areaName) {
  console.log('存储发生变化:', changes, areaName);
  
  if (areaName === 'local') {
    // 处理本地存储变化
    if (changes.isRecording) {
      const isRecording = changes.isRecording.newValue;
      updateBadge(isRecording ? 'REC' : '', isRecording ? '#dc3545' : '#28a745');
    }
    
    if (changes.playbackMode) {
      const playbackMode = changes.playbackMode.newValue;
      if (playbackMode) {
        updateBadge('PLAY', '#667eea');
      }
    }
  }
  
  if (areaName === 'sync') {
    // 处理同步存储变化，通知content script更新设置
    if (changes.showFloatingButton || changes.highlightElements || changes.showLogs) {
      chrome.tabs.query({}, function(tabs) {
        tabs.forEach(tab => {
          chrome.tabs.sendMessage(tab.id, {
            type: 'UPDATE_SETTINGS'
          }).catch(() => {
            // 忽略错误
          });
        });
      });
    }
  }
});

/**
 * 定期清理过期数据
 */
setInterval(function() {
  cleanupExpiredData();
}, 24 * 60 * 60 * 1000); // 每24小时清理一次

/**
 * 清理过期数据
 */
function cleanupExpiredData() {
  chrome.storage.local.get(['pageStats'], function(result) {
    const stats = result.pageStats || {};
    const now = Date.now();
    const monthAgo = now - (30 * 24 * 60 * 60 * 1000); // 30天前
    
    // 清理30天前的统计数据
    Object.keys(stats).forEach(domain => {
      if (stats[domain].lastVisit < monthAgo) {
        delete stats[domain];
      }
    });
    
    chrome.storage.local.set({ pageStats: stats });
  });
}

/**
 * 扩展启动时的初始化
 */
chrome.runtime.onStartup.addListener(function() {
  console.log('浏览器工作流扩展已启动');
  
  // 重置运行时状态
  chrome.storage.local.set({
    isRecording: false,
    playbackMode: false
  });
  
  // 重置徽章
  updateBadge('', '#28a745');
});

// 初始化徽章显示
updateBadge('', '#28a745'); 